package com.tinyengine.it.common.utils;

import cn.hutool.core.util.StrUtil;
import com.tinyengine.it.model.entity.DbTableFieldsInfo;

import java.util.ArrayList;
import java.util.List;

public class TableGeneratorUtils {

    public static String generateCreateTableSQL(List<DbTableFieldsInfo> fields, String tableName, String tableComment) {

        if (fields.isEmpty()) {
            return "";
        }

        // 初始化 CREATE TABLE 语句
        StringBuilder sql = new StringBuilder("CREATE TABLE  IF NOT EXISTS `").append(StrUtil.toUnderlineCase(tableName)).append("` (");

        List<String> columnDefs = new ArrayList<>();     // 用于保存每个字段定义
        List<String> primaryKeys = new ArrayList<>();    // 用于保存主键信息

        for (DbTableFieldsInfo field : fields) {
            StringBuilder columnDef = new StringBuilder("`")
                    .append(StrUtil.toUnderlineCase(field.getFieldCode()))
                    .append("` ")
                    .append(field.getDataType());

            // 拼接字段长度或精度
            appendLength(field, columnDef);

            // 添加自增关键字
            if (Boolean.TRUE.equals(field.getIncrement())) {
                columnDef.append(" AUTO_INCREMENT");
            }

            // 设置是否 NOT NULL
            columnDef.append(Boolean.TRUE.equals(field.getNotEmpty()) ? " NOT NULL" : " NULL");

            // 添加默认值
            if (field.getDefaultVal() != null && !field.getDefaultVal().isEmpty()) {
                if ("CURRENT_TIMESTAMP".equalsIgnoreCase(field.getDefaultVal()) &&
                        ("TIMESTAMP".equalsIgnoreCase(field.getDataType()) || "DATETIME".equalsIgnoreCase(field.getDataType()))) {
                    columnDef.append(" DEFAULT CURRENT_TIMESTAMP");
                } else {
                    columnDef.append(" DEFAULT '").append(field.getDefaultVal()).append("'");
                }
            }

            // 添加字段注释
            if (field.getNameCh() != null && !field.getNameCh().isEmpty()) {
                columnDef.append(" COMMENT '").append(field.getNameCh()).append("'");
            }

            // 添加主键标记
            if (Boolean.TRUE.equals(field.getPrimaryKey())) {
                primaryKeys.add("`" + field.getFieldCode() + "`");
            }

            columnDefs.add(columnDef.toString());
        }

        // 拼接字段定义部分
        sql.append(String.join(",", columnDefs));

        // 添加主键定义
        if (!primaryKeys.isEmpty()) {
            sql.append(",PRIMARY KEY (").append(String.join(", ", primaryKeys)).append(")");
        }

        // 表级属性（引擎、字符集等）
        sql.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci");

        // 添加表注释
        if (tableComment != null && !tableComment.isEmpty()) {
            sql.append(" COMMENT='").append(tableComment).append("'");
        }

        sql.append(";");

        return sql.toString();
    }

    /**
     * 为字段追加长度、精度信息，如 VARCHAR(200)、DECIMAL(10,2)
     */
    private static void appendLength(DbTableFieldsInfo field, StringBuilder sql) {
        String dataType = field.getDataType().toUpperCase();
        Integer length = field.getLength();
        Integer decimalPlaces = field.getDecimalPlaces();

        switch (dataType) {
            case "VARCHAR":
                String formatVar = String.format("(%d)", length != null ? length : 200);
                sql.append(formatVar);
                break;
            case "DECIMAL":
                int len = length != null ? length : 10;
                int dec = decimalPlaces != null ? decimalPlaces : 2;
                String format = String.format("(%d,%d)", len, dec >= 5 ? 5 : dec);
                sql.append(format);
                break;
            // 可以根据需要继续扩展如 CHAR、FLOAT 等
        }
    }


}
